Dataverse SDK For Python
Dataverse is a MLOPs platform for assisting in data selection, data visualization and model training in computer vision. Use Dataverse-SDK for Python to help you to interact with the Dataverse platform by Python. Currently, the library supports:
- Create Project with your input ontology and sensors
- Get Project by project-id
- Create Dataset from your AWS storage or local
- Get Dataset by dataset-id
- Create Dataslice from a whole dataset, or look one up by name
- List models for your selected project-id
- Get and download your model
- Convert a model to ONNX/TensorRT and read the convert record's metrics
Getting started
Install the package
pip install dataverse-sdk
Prerequisites: You must have an Dataverse Platform Account and Python 3.10+ to use this package.
Create the client
Interaction with the Dataverse site starts with an instance of the DataverseClient class. You need site url, an email-account and its password to instantiate the client object.
from dataverse_sdk import *
from dataverse_sdk.connections import get_connection
from dataverse_sdk.constants import DataverseHost
client = DataverseClient(
host=DataverseHost.PRODUCTION.value, email="XXX", password="***", service_id="xxxx-xxxx-xx-xxx", alias="default", force = False
)
assert client is get_connection("default")
# Should provide different alias if you are trying to connect to different workspaces
client2 = DataverseClient(
host=DataverseHost.PRODUCTION.value, email="account-2", password="***", service_id="xxxx-xxxx-xx-xxx", alias="client2", force = False
)
assert client2 is get_connection(client2.alias)
client3 = DataverseClient(
host=DataverseHost.PRODUCTION.value, email="XXX", password="", service_id="xxxx-xxxx-xx-xxx", access_token="xxx", alias="client3", force = False
)
assert client3 is get_connection(client3.alias)
- Input arguments:
| Argument name | Type/Options | Default | Description |
|---|---|---|---|
| host | str | *-- | the host url of the dataverse site |
| str | *-- | the email account of your dataverse workspace | |
| password | str | *-- | the password of your dataverse workspace |
| service_id | str | *-- | The service id of the dataverse you want to connect |
| alias | str | 'default' | the connection alias of your dataverse client |
| force | bool | False | whether force to replace the connection if the given alias exists |
| access_token | str | None | instead of password to do authentication |
Key concepts
Once you've initialized a DataverseClient, you can interact with Dataverse from the initialized object.
Examples
The following sections provide examples for the most common DataVerse tasks including:
- Get User
- List Projects
- Create Project
- Get Project
- Edit Project
- Update Alias
- Create Dataset
- List Dataset
- List Dataslices
- Get Dataslice by Name
- Create Dataslice from Dataset
- Export Dataslice
- List Models
- Get and Download Model
- Get Convert Model File
- Convert Model to ONNX/TRT
- Retrieve Convert Record
- Create VQA Project
- Edit VQA Ontology
- Get Question List
Get User
The get_user method is to list the current user info.
You can get the detail info, such as role, permission and user detail.
user = client.get_user()
List Projects
The list_projects method will list all projects of the given sites.
- Example Usage:
projects = client.list_projects(current_user = True,
exclude_sensor_type=SensorType.LIDAR,
image_type=OntologyImageType._2D_BOUNDING_BOX)
- Input arguments:
| Argument name | Type/Options | Default | Description |
|---|---|---|---|
| current_user | bool | True | only show the projects of current user |
| exclude_sensor_type | SensorType.CAMERA SensorType.LIDAR |
None | exclude the projects with the given sensor type |
| image_type | OntologyImageType._2D_BOUNDING_BOX OntologyImageType.SEMANTIC_SEGMENTATION OntologyImageType.INSTANCE_SEGMENTATION OntologyImageType.CLASSIFICATION OntologyImageType.POINT OntologyImageType.POLYGON OntologyImageType.POLYLINE OntologyImageType.VQA |
None | only include the projects with the given image type |
Create Project
The create_project method will create project on the connected site with the defined ontology and sensors.
- Example Usage:
# 1) Create ontology with ontologyclass object
ontology = Ontology(
name="sample ontology",
image_type=OntologyImageType._2D_BOUNDING_BOX,
pcd_type = None,
classes=[
OntologyClass(name="Pedestrian", rank=1, color="#234567"),
OntologyClass(name="Truck", rank=2, color="#345678"),
OntologyClass(name="Car", rank=3, color="#456789"),
OntologyClass(name="Cyclist", rank=4, color="#567890"),
OntologyClass(name="DontCare", rank=5, color="#6789AB"),
OntologyClass(name="Misc", rank=6, color="#789AB1"),
OntologyClass(name="Van", rank=7, color="#89AB12"),
OntologyClass(name="Tram", rank=8, color="#9AB123"),
OntologyClass(name="Person_sitting", rank=9, color="#AB1234"),
],
)
For project with camera sensor, there would be only one image_type for one project. You could choose from [OntologyImageType._2D_BOUNDING_BOX, OntologyImageType.SEMANTIC_SEGMENTATION, OntologyImageType.INSTANCE_SEGMENTATION, OntologyImageType.CLASSIFICATION, OntologyImageType.POINT, OntologyImageType.POLYGON, OntologyImageType.POLYLINE, OntologyImageType.VQA].
For project with lidar sensor, your should assign pcd_type = OntologyPcdType.CUBOID for the ontology.
# 2) Create your sensor list with name / SensorType
sensors = [
Sensor(name="camera1", type=SensorType.CAMERA),
Sensor(name="lidar1", type=SensorType.LIDAR),
]
# 3) Create your project tag attributes (Optional)
project_tag = ProjectTag(
attributes=[
{"name": "year", "type": "number"},
{
"name": "unknown_object",
"type": "option",
"options": [{"value": "fire"}, {"value": "leaves"}, {"value": "water"}],
},
]
)
# 4) Create your project with your ontology/sensors/project_tag
project = client.create_project(name="Sample project", ontology=ontology, sensors=sensors, project_tag=project_tag)
- Input arguments for creating project:
| Argument name | Type/Options | Default | Description |
|---|---|---|---|
| name | str | *-- | name of your project |
| ontology | Ontology | *-- | the Ontology basemodel data of current project |
| sensors | list[Sensor] | *-- | the list of Sensor basemodel data of your project |
| project_tag | ProjectTag | None | your project tags |
| description | str | None | your project description |
*--: required argument without default
- Check https://linkervision.gitbook.io/dataverse/data-management/project-ontology for the detail of
Project Ontology
Get Project
The get_project method retrieves the project from the connected site. The project_id parameter is the unique integer ID of the project, not its "name" property.
project = client.get_project(project_id= 1, client_alias=client.alias) # if client_alias is not provided, we'll get it from client
Edit Project
For editing project contents, we have four functions below for add/edit project tag and ontology classes.
Add New Project Tags
- Note: Can not create existing project tag!
tag = {
"attributes": [
{
"name": "month",
"type": "number"
},
{
"name": "weather",
"type": "option",
"options": [{"value":"sunny"}, {"value":"rainy"}, {"value":"cloudy"}
]
}]}
project_tag= ProjectTag(**tag)
#should provided client_alias if calling from client
client.add_project_tag(project_id = 10, project_tag=project_tag, client_alias=client.alias)
#OR
project.add_project_tag(project_tag=project_tag)
Edit Project Tags
** Note:
- Can not edit project tag that does not exist
- Can not modify the data type of existing project tags
- Can not provide attributes with existing options
tag = {
"attributes": [
{
"name": "weather",
"type": "option",
"options": [{"value":"unknown"}, {"value":"snowy"}
]
}]}
project_tag= ProjectTag(**tag)
#should provided client_alias if calling from client
client.edit_project_tag(project_id = 10, project_tag=project_tag, client_alias=client.alias)
#OR
project.edit_project_tag(project_tag=project_tag)
Add New Ontology Classes
- Note: Can not add existing ontology class!
new_classes = [OntologyClass(name="obstruction",
rank=9,
color="#AB4321",
attributes=[{
"name":
"status",
"type":
"option",
"options": [{
"value": "static"}, {"value": "moving"
}]}])]
#should provided client_alias if calling from client
client.add_ontology_classes(project_id=24, ontology_classes=new_classes, client_alias=client.alias)
#OR
project.add_ontology_classes(ontology_classes=new_classes)
Edit Ontology Classes
** Note:
- Can not edit ontology class that does not exist
- Can not modify the data type of existing ontology class attributes
- Can not provide attributes with existing options
edit_classes = [OntologyClass(name="obstruction",
color="#AB4321",
attributes=[{
"name":
"status",
"type":
"option",
"options": [{
"value": "unknown"}]}])]
#should provided client_alias if calling from client
client.edit_ontology_classes(project_id=24, ontology_classes=edit_classes, client_alias=client.alias)
#OR
project.edit_ontology_classes(ontology_classes=edit_classes)
Update Ontology Alias
- Get the csv file of alias map for your project
client.generate_alias_map(project_id=123, alias_file_path="./alias.csv")
-
Fill the alias in the csv file and save (DO NOT modify other fields)
-
Update alias for your project with the alias file path
client.update_alias(project_id=123, alias_file_path= "/Users/Downloads/alias.csv" )
Create Dataset
Required fields by data_source:
data_source |
storage_url |
container_name |
data_folder |
Notes |
|---|---|---|---|---|
DataSource.AWS |
*-- | - | *-- | use access_key_id + secret_access_key for a private S3 bucket |
DataSource.LOCAL |
- | - | *-- | local folder; SDK uploads files and sends create_dataset_uuid for you |
DataSource.SDK |
- | *-- | *-- | offline MinIO import: container_name = bucket, data_folder = path in bucket; needs Dataverse deployed in offline mode |
*--: required for this data_source · -: not used (can be omitted)
DataSource.DATA_GENERATIONandDataSource.PRE_IMPORTrequire adata_source_search_bodythat the SDK does not currently send, so they are not supported viacreate_dataset.
DataSource.EXISTING_DATASETS/EXISTING_DATASLICESonly appear on datasets you read back from the API; they are not inputs forcreate_dataset.
Use create_dataset to import dataset from cloud storage
dataset_data = {
"name": "Dataset 1",
"data_source": DataSource.AWS,
"storage_url": "storage/url",
"data_folder": "datafolder/to/vai_anno",
"type": DatasetType.ANNOTATED_DATA,
"annotation_format": AnnotationFormat.VISION_AI,
"annotations": ["groundtruth"],
"sequential": False,
"render_pcd": False,
"generate_metadata": False,
"access_key_id": "aws s3 access key id", # only for private s3 bucket, don't need to assign it in case of public s3 bucket
"secret_access_key": "aws s3 secret access key", # only for private s3 bucket, don't need to assign it in case of public s3 bucket
}
dataset = project.create_dataset(**dataset_data)
- Input arguments for creating dataset from
cloud storage:
| Argument name | Type/Options | Default | Description |
|---|---|---|---|
| name | str | *-- | name of your dataset |
| data_source | DataSource.AWS | *-- | the datasource of your dataset |
| storage_url | str | *-- | your cloud storage url |
| data_folder | str | *-- | the relative data folder from the storage_url |
| type | DatasetType.ANNOTATED_DATA DatasetType.RAW_DATA |
*-- | your dataset type (annotated or raw data) |
| annotation_format | AnnotationFormat.VISION_AI AnnotationFormat.KITTI AnnotationFormat.COCO AnnotationFormat.YOLO AnnotationFormat.IMAGE AnnotationFormat.BDDP AnnotationFormat.VIDEO AnnotationFormat.VLM |
*-- | the format of your annotation data |
| annotations | list[str] | None | list of names for your annotation data folders, such as ["groundtruth"] |
| sequential | bool | False | data is sequential or not |
| render_pcd | bool | False | render pcd preview image or not |
| generate_metadata | bool | False | generate image meta data or not |
| description | str | None | your dataset description |
| access_key_id | str | None | access key id for AWS private s3 bucket |
| secret_access_key | str | None | secret access key for AWS private s3 bucket |
*--: required for cloud storage
- Check https://linkervision.gitbook.io/dataverse/data-management/import-dataset for the detail of
Import Dataset.
Use create_dataset to import dataset from LOCAL
dataset_data2 = {
"name": "dataset-local-upload",
"data_source": DataSource.LOCAL,
"data_folder": "/YOUR/TARGET/LOCAL/FOLDER",
"type": DatasetType.ANNOTATED_DATA, # or DatasetType.RAW_DATA for images
"annotation_format": AnnotationFormat.VISION_AI,
"annotations": ["groundtruth"], # remove it when type is DatasetType.RAW_DATA
"sequential": False,
"generate_metadata": False,
}
dataset2 = project.create_dataset(**dataset_data2)
Your could also use the script for importing dataset from local
python tools/import_dataset_from_local.py -host {YOUR_HOST} -e {your-account-email} -p {PASSWORD} -s {service-id} -project {project-id} --folder {/YOUR/TARGET/LOCAL/FOLDER} -name {dataset-name} -type {raw_data OR annotated_data} -anno {image OR vision_ai} --sequential
List and Get Dataset
The list_datasets method would return the list of dataset under the given project
project = client.get_project(project_id=1)
datasets:list = project.list_datasets()
OR
datasets:list = client.list_datasets(project_id=1, client_alias=client.alias )
The get_dataset method retrieves the dataset info from the connected site. The dataset_id parameter is the unique integer ID of the dataset, not its "name" property.
dataset = client.get_dataset(dataset_id=5)
List and Get Dataslices
# list dataslices with project_id
client.list_dataslices(project_id=101, client_alias=client.alias)
# Get target dataslice data
dataslice_data = client.get_dataslice(dataslice_id=504)
Get Dataslice by Name
Dataslice names are unique across the site, so a name identifies exactly one dataslice.
dataslice = client.get_dataslice_by_name(project_id=101, dataslice_name="my-dataslice")
# OR from the project object
project = client.get_project(project_id=101)
dataslice = project.get_dataslice_by_name(dataslice_name="my-dataslice")
dataslice.id
dataslice.status # DataSliceStatus
dataslice.image_count
DataSliceStatus: CREATING, CREATING_FAIL, READY, ANNOTATION_UPDATING,
IQA_UPDATING, TAGGING_UPDATING, DELETING.
image_count and pcd_count read the per-type datarow counts in dataslice.metadata.
Which of them carries a number follows the slice's own type:
dataslice.type |
image_count |
pcd_count |
|---|---|---|
image |
images | None |
pcd |
None |
pcds |
frame / sequence |
images | pcds |
The last row is the fused camera-plus-lidar case, where both are counted and both can be
non-zero. None means "this slice holds no datarow of that type", never zero.
get_dataslice and get_dataslice_by_name return metadata; list_dataslices answers
with plain dicts carrying only id, name and file_count — the slice's image and pcd
datarows counted together.
This is the only method that takes a name: everything downstream — convert_model
included — takes ids, so this is how a name becomes one.
Raises ValueError when the project holds no dataslice of that name.
Create Dataslice from Dataset
create_dataslice_from_dataset turns a whole dataset into a dataslice — the equivalent of
opening it in Data Visualization and hitting Save Data Slice without narrowing the
selection. It is asynchronous: the returned dataslice starts out creating with no
file count, and turns ready once the datarows are in.
dataslice = client.create_dataslice_from_dataset(
project_id=101,
dataset_id=5,
dataslice_name="whole-dataset-slice",
)
# OR from the project object
dataslice = project.create_dataslice_from_dataset(
dataset_id=5, dataslice_name="whole-dataset-slice"
)
# Poll until it settles
import time
from dataverse_sdk import DataSliceStatus
SETTLED = (DataSliceStatus.READY, DataSliceStatus.CREATING_FAIL)
while dataslice.status not in SETTLED:
time.sleep(10)
dataslice = client.get_dataslice(dataslice_id=dataslice.id)
print(dataslice.status, dataslice.image_count) # "ready" 11
A convert record polls the same way through get_convert_record, with
ConvertRecordStatus.READY and ConvertRecordStatus.FAILED as its settled states.
| Argument name | Type | Default | Description |
|---|---|---|---|
| project_id | int | *-- | Project the dataset belongs to |
| dataset_id | int | *-- | Every datarow of this dataset goes into the slice |
| dataslice_name | str | *-- | Must be unused site-wide |
| description | str | None |
*--: required argument without default
Export Dataslice and Download
# Trigger export and get export record id
export_record = client.export_dataslice(dataslice_id=504)
# Use export record id to download export data
client.download_export_dataslice_data(dataslice_id=504, export_record_id=export_record["export_record_id"])
Note: Direct export via
export_datasliceis limited to 1,000 records. For dataslices exceeding this limit, usetools/export_dataslice_large.pyinstead (see Export Large Dataslice and download files), which exports the dataslice in batches.
List Models
The list_models method will list all the models in the given project. You can filter models by type using the type parameter.
Basic Usage
# Method 1: Using client
models = client.list_models(project_id=1, client_alias=client.alias)
# Method 2: Using project object
project = client.get_project(project_id=1)
models = project.list_models()
Each model carries a status, which is what a listing is usually narrowed by:
from dataverse_sdk import MLModelStatus
ready = [model for model in models if model.status == MLModelStatus.READY]
MLModelStatus: PROCESSING, READY, DELETING.
Filtering by Model Type
You can filter models by type using strings or lists of strings. The SDK supports multiple model types:
# Filter by single type using string
models = client.list_models(project_id=1, type="trained", client_alias=client.alias)
# Filter by single type using list
models = client.list_models(project_id=1, type=["trained"], client_alias=client.alias)
# Filter by multiple types using list
models = client.list_models(
project_id=1,
type=["trained", "byom", "uploaded"],
client_alias=client.alias
)
Available Model Types
| String Value | Description |
|---|---|
"trained" |
Trained models |
"byom" |
Bring Your Own Model |
"uploaded" |
Uploaded models |
Input Arguments
| Argument name | Type/Options | Default | Description |
|---|---|---|---|
| project_id | int | *-- | The project ID |
| client_alias | str | None | The client alias |
| type | "trained", "byom", "uploaded", list["trained", "byom", "uploaded] | ["trained", "byom"] | Model types to filter by |
*--: required argument without default
Get Model
The get_model method will get the model detail info by the given model-id
model = client.get_model(model_id=30, client_alias=client.alias)
model = project.get_model(model_id=30)
From the given model, we could get the model convert records as below
model_record = client.get_convert_record(convert_record_id=1, client_alias=client.alias)
OR
model_record = model.get_convert_record(convert_record_id=1)
- If the converted model format is onnx, you could download the model as below.
# Get the target convert record, and download labels.txt and model.onnx
model_record = model.get_convert_record(convert_record_id=5)
status, label_file_path = model_record.get_label_file(save_path="./labels.txt", timeout=6000)
status, onnx_model_path = model_record.get_onnx_model_file(save_path="./model.onnx", timeout=6000)
Get Convert Model File
The get_convert_model_file method will download one of the stored artifacts of a convert record, selected by the file_type argument.
from dataverse_sdk import ConvertModelFileType
# Method 1: Using client
status, save_path = client.get_convert_model_file(
convert_record_id=5,
file_type=ConvertModelFileType.TRITON,
client_alias=client.alias,
)
# Method 2: Using convert record object
model_record = model.get_convert_record(convert_record_id=5)
status, save_path = model_record.get_convert_model_file(file_type=ConvertModelFileType.TRITON)
Available File Types
| Enum Value | String Value | File downloaded | Available when | Default save_path |
|---|---|---|---|---|
ConvertModelFileType.TRITON |
"triton" |
Triton bundle (.zip) |
always | ./triton.zip |
ConvertModelFileType.MODEL |
"model" |
Main artifact: model.onnx (format=onnx) or trt.engine (format=trt) |
always | ./converted_model |
ConvertModelFileType.RAW_ONNX |
"raw_onnx" |
Intermediate onnx (fp16: trt.onnx; D-FINE int8: fp32 model.onnx) |
format=trt | ./raw.onnx |
ConvertModelFileType.CALIB_CACHE |
"calib_cache" |
trt_int8_calib.cache (int8 scale table) |
D-FINE + int8 only | ./trt_int8_calib.cache |
When save_path is omitted, the filename is resolved in this order:
- The name the server supplies in the response's
Content-Dispositionheader — this is the artifact's real stored filename (e.g.ptq.engine,triton_model.zip), so it already reflects the convert format and precision. - The Default
save_pathin the table above, used only when the server sends no usable filename.
Pass an explicit save_path whenever you need a predictable location — it always takes precedence over the server's name.
Input Arguments
| Argument name | Type/Options | Default | Description |
|---|---|---|---|
| convert_record_id | int | *-- | The convert record to download from |
| file_type | ConvertModelFileType, "triton", "model", "raw_onnx", "calib_cache" | ConvertModelFileType.TRITON | Which artifact to download |
| save_path | str | None | Local path to write the file; when omitted the server's filename is used (see above) |
| timeout | int | 3000 | Maximum timeout of the request |
| permission | str | "" | Sets the X-Request-Source header; pass the caller's permission source if required |
| client | DataverseClient | None | Client instance; if omitted, client_alias must be given |
| client_alias | str | None | Registered client alias; required when client is None |
*--: required argument without default
Return
tuple[bool, str] — (status, save_path). status is False if the download failed, and save_path is the path that was written to.
Convert Model to ONNX/TRT
convert_model starts a model conversion. It is asynchronous: the call returns the
ids of the created convert records, and the conversion itself finishes later.
from dataverse_sdk import ConvertFormat, ConvertPrecision, QuantizationMethod
# Method 1: Using client -- model 6418 is a YOLOv9, which is NMS-based
record_ids = client.convert_model(
model_id=6418,
name="onnx-fp16",
target_dataslice_id=504, # ids only; see Get Dataslice by Name
model_type=ConvertFormat.ONNX,
data_type=ConvertPrecision.FP16,
confidence_score=10,
nms_threshold=50,
client_alias=client.alias,
)
# Method 2: Using the model object -- model 7201 is a D-FINE, which is NMS-free
model = client.get_model(model_id=7201, client_alias=client.alias)
record_ids = model.convert(
name="trt-int8-ptq",
target_dataslice_id=504,
model_type=ConvertFormat.TRT,
data_type=ConvertPrecision.INT8,
quantizations=[QuantizationMethod.PTQ],
quantize_dataslice_id=508,
)
Input Arguments
| Argument name | Type/Options | Default | Description |
|---|---|---|---|
| model_id | int | *-- | The source model to convert |
| name | str | *-- | Convert record name; must be unused under this model |
| target_dataslice_id | int | *-- | Dataslice the converted model is evaluated on |
| model_type | ConvertFormat | str | *-- | Target format |
| data_type | ConvertPrecision | str | *-- | Numeric precision; fp32 is D-FINE only |
| confidence_score | int | 10 | Confidence threshold, 10-90 |
| iou | int | 50 | IoU threshold, 1-99 |
| topk | int | None | 50-300; 300 for D-FINE, 100 for every other structure |
| main_obj_low | int | 1024 | Main object size lower bound |
| main_obj_high | int | 9216 | Main object size upper bound |
| resolution_width | int | None | Defaults to the source model's own resolution |
| resolution_height | int | None | Defaults to the source model's own resolution |
| nms_threshold | int | None | 10-90; required for every structure except D-FINE |
| nms_class_agnostic | bool | None | Rejected for D-FINE |
| machine_type | str | None | |
| quantize_dataslice_id | int | None | Calibration dataslice; has to be given together with quantizations |
| quantizations | list[QuantizationMethod | str] | None | Exactly one method; required for int8, rejected for every other data_type; only PTQ is supported for D-FINE |
| model_structure | ModelStructure | str | None | The source model's architecture; sets the topk default and the D-FINE rules. Read back from the model when omitted |
*--: required argument without default
Every enum below is a str enum, so the member and its plain string are interchangeable:
| Enum | Members | Strings |
|---|---|---|
ConvertFormat |
ONNX, TRT |
"onnx", "trt" |
ConvertPrecision |
FP32, FP16, INT8 |
"fp32", "fp16", "int8" |
QuantizationMethod |
PTQ, QAT_TRAIN, QAT_DISTILL |
"ptq", "qat_train", "qat_distill" |
ModelStructure |
YOLOV9_C, YOLOV9_E, YOLOV9_S |
"yolov9-c", "yolov9-e", "yolov9-s" |
DFINE_N, DFINE_S, DFINE_M, DFINE_L, DFINE_X |
"dfine-n", "dfine-s", "dfine-m", "dfine-l", "dfine-x" |
convert_model, get_convert_record, get_convert_record_by_name and
list_convert_records are static methods, so they need client_alias (or client)
passed in; without either they raise ValueError. The dataslice methods above are
instance methods and fall back to the client's own alias.
Supported resolutions are 640x480, 640x640, 1024x576, 1024x768 and 1024x1024; an unsupported one raises APIValidationError without sending the request.
The server decides the rest, so these can change; at the time of writing:
model_structure |
data_type |
model_type |
quantizations |
|---|---|---|---|
| yolov9 | fp16 |
onnx or trt |
none |
| yolov9 | int8 |
trt |
ptq, qat_train, qat_distill |
| D-FINE | fp32 |
onnx |
none |
| D-FINE | fp16 |
trt |
none |
| D-FINE | int8 |
trt |
ptq |
int8 must carry exactly one quantization method and every other data_type must
carry none -- that holds for both families, so a yolov9 int8 convert without
quantizations raises APIValidationError instead of reaching the backend. The
method itself is what differs: D-FINE's int8 only takes ptq, while yolov9 takes
any of the three. A structure the SDK does not know is left to the server.
Return
list[int] — ids of the created convert records, one per quantization method. The
backend takes only one quantization method for now, so today the list always holds
exactly one id.
Keeping it to one request
Both dataslices are given by id, so the only extra request left is the read-back of the
source model — and passing model_structure together with both resolutions skips
that too, which is what model.convert() does with the three it already holds. Chaining
from objects you already have is therefore the cheapest form:
model = client.get_model(model_id=6418, client_alias=client.alias)
dataslice = project.get_dataslice_by_name("my-eval-dataslice")
record_ids = model.convert(
name="onnx-fp16",
target_dataslice_id=dataslice.id,
model_type=ConvertFormat.ONNX,
data_type=ConvertPrecision.FP16,
nms_threshold=50,
)
record = client.get_convert_record(convert_record_id=record_ids[0], client_alias=client.alias)
record.status
Retrieve Convert Record and its Metrics
A convert name is only unique per source model — two models may each own a record
called onnx-fp16 — so a lookup by name takes the model alongside it.
# By id
record = client.get_convert_record(convert_record_id=2212, client_alias=client.alias)
# By name, under a given model
record = client.get_convert_record_by_name(
model_id=6418, convert_name="onnx-fp16", client_alias=client.alias
)
# OR from the model object
model = client.get_model(model_id=6418, client_alias=client.alias)
record = model.get_convert_record_by_name(convert_name="onnx-fp16")
record.status # ConvertRecordStatus
record.id
record.model_type # "onnx" / "trt" -- reads configuration["format"]
record.data_type # "fp32"/"fp16"/"int8" -- reads configuration["precision"]
record.f1_score # and .precision, .recall, .map_5_95
record.configuration carries every other convert setting. The four metrics read as
0.0 until the conversion finishes, and None when the server did not return them at all
— mind that record.precision is one of them, and the precision the model was converted
at is record.data_type.
Looking a record up by name, filtering a listing, and reading the ids back from
convert_model all need a Dataverse recent enough to serialise them; against an older
site the SDK falls back to filtering the full listing itself.
List Convert Records
# Every convert record in a project
records = client.list_convert_records(project_id=1992, client_alias=client.alias)
# OR
records = project.list_convert_records()
# Narrow by model / name / status
records = client.list_convert_records(
model_id=6418, status="ready", client_alias=client.alias
)
# OR
records = model.list_convert_records(status="ready")
Create VQA Project
The create_vqa_project method will create project on the connected site with the defined questions/answer_type.
- Example Usage:
# 1) Create question class with question and answer type pair
question_answer = [ QuestionClass(class_name="question1", rank=1, question="Is any person found in the picture?",
answer_type="boolean"),
QuestionClass(class_name="question2", rank=2, question="What is the blob color of traffic light?", answer_type="option",answer_options=["red","yellow","green"])
]
# 2) Create your VQA project as below
project = client.create_vqa_project(name="vqa-project", sensor_name="camera1", ontology_name="vqa-ontology", question_answer=question_answer)
- Input arguments for creating project:
| Argument name | Type/Options | Default | Description |
|---|---|---|---|
| name | str | *-- | name of your project |
| sensor_name | str | *-- | the camera sensor name |
| ontology_name | str | *-- | the ontology name |
| question_answer | list[QuestionClass] | *-- | your question/answer_type. QuestionClass.answer_type valid values: boolean, option, number, text |
| description | str | None | your project description |
*--: required argument without default
Edit VQA Ontology
** Note:
- Can not edit question answer type
- Can not update with existing answer options
- Can not add question with existing rank id
create_questions = [QuestionClass(class_name="question3", rank=3, question="Age?",answer_type="number")]
update_questions = [{"rank": 2, "question": "What is the blob color of traffic light?(the closet one)", "options":["black"] }]
# Through client
client.edit_vqa_ontology(project_id=24, ontology_name="ontology-new-name",
create=create_questions,
update=update_questions,
client_alias=client.alias)
# Through project object
project.edit_vqa_ontology(ontology_name="ontology-new-name",
create=create_questions,
update=update_questions)
Get Question List
The function below could help you get the question list of VQA project (which could help you to prepare the annotated data)
output = client.get_question_list(project_id=107, output_file_path="./question.json" )
Quick Tools
Import Your Local Dataset
python tools/import_dataset_from_local.py -host {YOUR_HOST} -e {your-account-email} -p {PASSWORD} -s {service-id} -project {project-id} --folder {/YOUR/TARGET/LOCAL/FOLDER} -name {dataset-name} -type {raw_data OR annotated_data} -anno {image OR vision_ai} --sequential
Import VQA Local Dataset
python tools/import_vqa_dataset.py -host {YOUR_HOST} -e {your-account-email} -p {PASSWORD} -s {service-id} -project {project-id} --folder {/YOUR/TARGET/LOCAL/FOLDER} -type {raw_data OR annotated_data}
Export Dataslice and download files
python tools/export_dataslice.py -host {YOUR_HOST} -e {your-account-email} -p {PASSWORD} -s {service-id} -dataslice {dataslice_id} -f {/YOUR/TARGET/LOCAL/file.zip}
Export Large Dataslice and download files
python tools/export_dataslice_large.py -host {YOUR_HOST} -e {your-account-email} -p {PASSWORD} -s {service-id} -dataslice {dataslice_id} --anno {export-model-name / groundtruth} --target_folder {folder path} --export-format {coco, visionai, yolo, vlm ...etc}
Upload videos to create session tasks
python tools/upload_videos_create_session.py -host {YOUR_HOST} -e {your-account-email} -p {PASSWORD} -s {service-id} -f {/YOUR/VIDEOS/LOCAL/FOLDER} -n {session-name}
- Advanced arguments for video curation (sequential data):
| Argument name | Type/Options | Default | Description |
|---|---|---|---|
| --video-curation | bool | False | enable video curation (sequential data) |
| --global-mean-threshold | float | 0.001 | Threshold for the video's global average motion magnitude (0.000001 ~ 0.01). Higher values are stricter (flag more clips as low-motion); lower values are looser (flag fewer clips). |
| --per-patch-256-min-threshold | float | 0.000001 | Minimum average motion magnitude allowed in any 256x256 pixel patch (0.000001 ~ 0.0001). Higher values are stricter per-patch (flag more clips when any 256x256 patch is too still); lower values are looser (flag fewer clips). |
| --split-duration | int | 5 | Set the length of each split clip in seconds (2 ~ 30s). |
Links to language repos
Metadata
Release files for dataverse-sdk 2.8.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| dataverse_sdk-2.8.0.tar.gz | 85.8 kB | Without provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| dataverse_sdk-2.8.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 155.7 kB
Release files / dataverse_sdk-2.8.0.tar.gz
| Download URL | dataverse_sdk-2.8.0.tar.gz |
|---|---|
| Size | 85.8 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
b4bb4fb193ffd8b1b029ee5e17eccb8d53a6c446984a1f03092cd1e72ff15e57
|
|
BLAKE2b-256 checksum How to use checksums |
3b1eac97e7e65ade5a400f45bbb32cf1575ab4fdae307ca8342f85a373fb6b68
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.11.9
|
Release files / dataverse_sdk-2.8.0-py3-none-any.whl
| Download URL | dataverse_sdk-2.8.0-py3-none-any.whl |
|---|---|
| Size | 69.9 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
592c5ccaefae8376707fc821e66e0b22ca1160f5612430d947508934bb7e68f2
|
|
BLAKE2b-256 checksum How to use checksums |
bbccda57b768a02e8a2709f1a51436592d4fcfd8db96f54978029533d824327e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.11.9
|
Security for dataverse-sdk 2.8.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.